package com.kaikeba.service;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.BaseExpressDao;
import com.kaikeba.dao.Impl.ExpressDaoMySql;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.RandomUtil;
import com.kaikeba.util.SMSUtil;

import java.util.List;
import java.util.Map;

public class ExpressService {
    private static BaseExpressDao dao = new ExpressDaoMySql();
    /**
     * 用于查询数据库中的全部快递（数量+新增），待取件数（总数+新增）
     *
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit      是否分页的标记，true表示分页
     * @param offset     SQL语句的起始索引
     * @param pageNumber 每页查询的数量
     * @return 快递的集合
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit,offset,pageNumber);
    }

    /**
     * 根据快递单号查询快递
     *
     * @param number 快递单号
     * @return 查询的快递信息，不存在时返回null
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据取件码查询快递
     *
     * @param code 取件码
     * @return 查询的快递信息，不存在时返回null
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据录入人的手机号码查询录入的所有记录
     *
     * @param sysPhone 录入人的手机号码
     * @return 查询的快递信息列表
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 根据用户的手机号码查询录入的所有记录
     *
     * @param userPhone@return 查询的快递信息列表
     */
    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据用户的手机号码和状态码查询录入的所有记录
     *
     * @param userPhone 用户的手机号码
     * @param status    状态
     * @return 查询的快递信息列表
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone, int status){
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 录入快递
     *
     * @param e 要录入的快递对象
     * @return 录入的结果，true表示成功，false表示失败
     */
    public static boolean insert(Express e) {
        e.setCode(RandomUtil.getCode()+"");
        try {
            boolean flag = dao.insert(e);
            if (flag){
                SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException duplicateCodeException) {
            duplicateCodeException.printStackTrace();
            return insert(e);
        }
    }

    /**
     * 录入快递
     *
     * @param id         要修改的快递id
     * @param newExpress 新的快递对象（number,company,username,userPhone）
     * @return 录入的结果，true表示成功，false表示失败
     */
    public static boolean update(int id, Express newExpress) {
        if (newExpress.getUserPhone()!=null){
            dao.delete(id);
            return insert(newExpress);
        }
        else {
            boolean update = dao.update(id, newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if(newExpress.getStatus()==1){
                updateStatus(e.getCode());  //改为取件状态
            }
            return update;
        }
    }

    /**
     * 更改快递状态为1，表示取件完成
     *
     * @param code@return 取件的结果，true表示成功，false表示失败
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根据id，删除快递
     *
     * @param id 要删除的快递id
     * @return 删除信息，true表示成功
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
